home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / GRAPHICS / VGATUT3.ZIP / PALLFUNC.CPP next >
Encoding:
C/C++ Source or Header  |  1995-08-24  |  5.6 KB  |  261 lines

  1. #include "..\include\vgafunc.h"
  2. #include <conio.h>
  3. #include <string.h>
  4.  
  5. void GetAllPalette( unsigned char *Pal )
  6. {
  7.     int nTmp = 0;
  8.  
  9.     for (int nIndex=0; nIndex<256; nIndex++)
  10.     {
  11.     // output nIndex to port 0x3C7
  12.     outp( 0x3C7, nIndex );
  13.  
  14.     // read values into array
  15.     Pal[nTmp++] = inp(0x3C9);
  16.     Pal[nTmp++] = inp(0x3C9);
  17.     Pal[nTmp++] = inp(0x3C9);
  18.     }
  19. }
  20.  
  21. void SetAllPalette( unsigned char *Pal )
  22. {
  23.     int nPalPoint=0;
  24.  
  25.     // WaitVerticalRetrace();
  26.  
  27.     for (int nIndex=0; nIndex<256; nIndex++)
  28.     {
  29.     // output nIndex to port 0x3C7
  30.     outp( 0x3C7, nIndex );
  31.  
  32.     // output values to VGA
  33.     outp( 0x3C9, Pal[nPalPoint++] );
  34.     outp( 0x3C9, Pal[nPalPoint++] );
  35.     outp( 0x3C9, Pal[nPalPoint++] );
  36.     }
  37. }
  38.  
  39. void SetPalToBlack()
  40. {
  41.     int nPalPoint=0;
  42.  
  43.     for (int nIndex=0; nIndex<256; nIndex++)
  44.     {
  45.     // output nIndex to port 0x3C7
  46.     outp( 0x3C7, nIndex );
  47.  
  48.     // output values to VGA
  49.     outp( 0x3C9, 0);
  50.     outp( 0x3C9, 0);
  51.     outp( 0x3C9, 0);
  52.     }
  53. }
  54.  
  55. void FadePalToBlack( unsigned char *Pal, unsigned char nStep )
  56. {
  57.     int nTmp;    // loop counter
  58.  
  59.     static unsigned short TempPal[768];
  60.  
  61.     // make a copy of palette - use fixed point to improve accuracy but
  62.     // retain speed
  63.     for (nTmp=0; nTmp<768; nTmp++)
  64.     TempPal[nTmp] = (Pal[nTmp]<<10);
  65.  
  66.     for (nTmp=0; nTmp<nStep; nTmp++)
  67.     {
  68.     // calculate values
  69.     for (int nIndex=0; nIndex<768; nIndex++)
  70.     {
  71.         if (TempPal[nIndex] > 0)
  72.         TempPal[nIndex] -= (Pal[nIndex]<<3);
  73.     }
  74.     }
  75.  
  76.     // fill old palette with new data
  77.     for (nTmp=0; nTmp<768; nTmp++)
  78.     Pal[nTmp]=(TempPal[nTmp]>>10);
  79. }
  80.  
  81. void FadePalFromBlack( unsigned int *Current, unsigned char *ToPal, int nStep )
  82. {
  83.     int nTmp;    // loop counter
  84.  
  85.     for (nTmp=0; nTmp<nStep; nTmp++)
  86.     {
  87.     // calculate values
  88.     for (int nIndex=0; nIndex<768; nIndex++)
  89.     {
  90.         if (Current[nIndex] <  (ToPal[nIndex]<<10))
  91.         Current[nIndex] += (ToPal[nIndex]<<3);
  92.     }
  93.     }
  94. }
  95.  
  96. void FadePalToPal( unsigned char *FromPal, unsigned char *ToPal )
  97. {
  98.     int nTmp;    // loop counter
  99.  
  100.     int nPalPoint;
  101.     int nDiff;
  102.  
  103.     static unsigned short TempPal[768];
  104.  
  105.     // make copy of palette
  106.     for (nTmp=0; nTmp < 768; nTmp++)
  107.     TempPal[nTmp] = (FromPal[nTmp]<<10);
  108.  
  109.     for (nTmp=0; nTmp<128; nTmp++)
  110.     {
  111.     // calculate new values
  112.     for (int nIndex=0; nIndex<768; nIndex++)
  113.     {
  114.         // only modify values that are not equal yet
  115.         if (TempPal[nIndex] != (ToPal[nIndex]<<10) )
  116.         {
  117.         if (TempPal[nIndex] < (ToPal[nIndex]<<10) )
  118.             TempPal[nIndex] += ((ToPal[nIndex] - FromPal[nIndex])<<3);
  119.         else
  120.             TempPal[nIndex] -= ((FromPal[nIndex] - ToPal[nIndex])<<3);
  121.         }
  122.     }
  123.  
  124.     nPalPoint=0;
  125.  
  126.     for (nIndex=0; nIndex<256; nIndex++)
  127.     {
  128.  
  129.         // output nIndex to port 0x3C7
  130.         outp( 0x3C7, nIndex );
  131.  
  132.         // output values to VGA
  133.         outp( 0x3C9, (TempPal[nPalPoint++]>>10) );
  134.         outp( 0x3C9, (TempPal[nPalPoint++]>>10) );
  135.         outp( 0x3C9, (TempPal[nPalPoint++]>>10) );
  136.     }
  137.     }
  138. }
  139.  
  140. void MakeGradPal( GradPal *Data, int NumValues, unsigned char *Pal )
  141. {
  142.     int nDist=0;
  143.     int nChgRed, nChgGrn, nChgBlu;
  144.  
  145.     int nCurrentIndex=0;
  146.  
  147.     // 16 bit temporary palette
  148.     static unsigned int TempPal[3] = {0};
  149.  
  150.     // clear palette array
  151.     for (int Tmp=0; Tmp<768; Tmp++)
  152.     Pal[Tmp]=0;
  153.  
  154.     // loop through number of values
  155.     for (Tmp=0; Tmp<NumValues; Tmp++)
  156.     {
  157.     // find distance
  158.     nDist = (Data[Tmp+1].Index - Data[Tmp].Index);
  159.  
  160.     // kludge to ensure no DIV/0 errors
  161.     if (nDist==0)
  162.         nDist=1;
  163.  
  164.     // find colour change over whole
  165.     nChgRed = ( ( (Data[Tmp+1].Red<<9)   - (Data[Tmp].Red<<9)  ) / nDist);
  166.     nChgGrn = ( ( (Data[Tmp+1].Green<<9) - (Data[Tmp].Green<<9)) / nDist);
  167.     nChgBlu = ( ( (Data[Tmp+1].Blue<<9)  - (Data[Tmp].Blue<<9) ) / nDist);
  168.  
  169.     // starting point
  170.     TempPal[0] = (Data[Tmp].Red<<9    );
  171.     TempPal[1] = (Data[Tmp].Green<<9);
  172.     TempPal[2] = (Data[Tmp].Blue<<9 );
  173.  
  174.     // loop through range provided by data structure
  175.     for (int nIndex=Data[Tmp].Index;
  176.          nIndex<Data[Tmp+1].Index;
  177.          nIndex++)
  178.     {
  179.         // write values to palette
  180.         Pal[nCurrentIndex++] = (TempPal[0]>>9);
  181.         Pal[nCurrentIndex++] = (TempPal[1]>>9);
  182.         Pal[nCurrentIndex++] = (TempPal[2]>>9);
  183.  
  184.         // increment values for next loop
  185.         TempPal[0] += nChgRed;
  186.         TempPal[1] += nChgGrn;
  187.         TempPal[2] += nChgBlu;
  188.     }
  189.     }
  190. }
  191.  
  192. void PalCycle( unsigned char *Pal, int Number, int nStart, int nFinis )
  193. {
  194.     int nTmp;
  195.  
  196.     int nStartInd = (nStart*3);
  197.     int nFinisInd = (nFinis*3);
  198.     int nRange      = (nFinisInd-nStartInd);
  199.  
  200.     if (nRange<0)
  201.     nRange =- nRange;
  202.  
  203.     // holds a copy of the palette
  204.     unsigned char Temp[3];
  205.  
  206.     if (Number>0)
  207.     {
  208.     for (int nLoop=0; nLoop<Number; nLoop++)
  209.     {
  210.         // store last colour
  211.         memmove( Temp, &Pal[nFinisInd], 3 );
  212.  
  213.         // move palette up 1
  214.         memmove( &Pal[nStartInd+3], &Pal[nStartInd], nRange );
  215.  
  216.         // place highest colour in 1st index
  217.         memmove( &Pal[nStartInd], Temp, 3 );
  218.     }
  219.     }
  220.     else
  221.     {
  222.     for (int nLoop=0; nLoop>Number; nLoop--)
  223.     {
  224.         // store first colour
  225.         memmove( Temp, &Pal[0], 3 );
  226.  
  227.         // move palette down 1
  228.         memmove( &Pal[0], &Pal[3], 762);
  229.  
  230.         // place first colour into second last palette index
  231.         memmove( &Pal[762], Temp, 3 );
  232.     }
  233.     }
  234. }
  235.  
  236. void CopyPalette( unsigned char *OrigPal, unsigned char *NewPal )
  237. {
  238.     for (int Tmp=0; Tmp<768; Tmp++)
  239.     NewPal[Tmp] = OrigPal[Tmp];
  240. }
  241.  
  242. void WaitVerticalRetrace(void)
  243. {
  244.   // wait for vertical retrace to begin
  245.  
  246.   _asm
  247.   {
  248.     mov dx, 0x03DA
  249.  
  250.     t1:
  251.       in  al, dx
  252.       and al, 0x08
  253.       jz t1
  254.  
  255.     t2:
  256.       in  al, dx
  257.       and al, 0x08
  258.       jnz t2
  259.   }
  260. }
  261.